/*
 * MetodoBase.java	 
 *
 * Copyright 2009 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 05/10/09, 11:23:38 AM
 */

package com.ufps.cuatro.util.base;

import java.util.ArrayList;

/**
 * <i><b>MetodoBase:</b></i> Representa la Definición de un Método Swing asociado a su
 * respectivo Evento de yente.
 * 
 * @author  Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 05/10/09
 * @see EventoBase
 */
public class MetodoBase extends EventoBase{
    private static final long serialVersionUID = -6443936355378852288L;
    
    /**
     * Class del Tipo devuelto por el Método.
     */
    protected String strReturn;
    /**
     * Estado que indica si el Tipo devuelto por el Método es un primitivo.
     */
    protected boolean primitive;
    /**
     * Estado indica si el Tipo devuelto es un array.
     */
    protected boolean array;
    private ArrayList<ParametroMetodoBase> objParametrosMetodo;

    /**
     * Constructor por Defecto.
     */
    public MetodoBase() {
    }

    /**
     * Constructor utilizado en la Implementación.
     * @param id Indice de definición en el Archivo de Propiedades.
     * @param strNombre Nombre del Evento.
     * @param strAlias Nombre corto ó alias asociado al Evento.
     * @param strTooltips Mensaje informativo asociado al Evento.
     * @param strReturn Class del Tipo devuelto por el Método.
     * @param primitive Estado que indica si el Tipo devuelto por el Método es un primitivo.
     * @param array Estado indica si el Tipo devuelto es un array.
     */
    public MetodoBase(int id, String strNombre, String strAlias, String strTooltips, String strReturn, boolean primitive, boolean array) {
        super(id, strNombre, strAlias, strTooltips);
        this.strReturn = strReturn;
        this.primitive = primitive;
        this.array = array;
    }    
    
    /**
     * Constructor Urilizado en la Implementación.
     * @param id Indice de definición en el Archivo de Propiedades.
     * @param strNombre Nombre del Evento.
     * @param strAlias Nombre corto ó alias asociado al Evento.
     * @param strTooltips Mensaje informativo asociado al Evento.
     * @param objOyente Oyente padre del Método.
     * @param strReturn Class del Tipo devuelto por el Método.
     * @param primitive Estado que indica si el Tipo devuelto por el Método es un primitivo.
     * @param array Estado indica si el Tipo devuelto es un array.
     */
    public MetodoBase(int id, String strNombre, String strAlias, String strTooltips, OyenteBase objOyente, String strReturn, boolean primitive, boolean array) {
        super(id, strNombre, strAlias, strTooltips, objOyente);
        this.strReturn = strReturn;
        this.primitive = primitive;
        this.array = array;
    }

    /**
     * Devuelve el Estado que indica si el Valor de Retorn es un Array.
     * @return Estado que indica si el Valor de Retorn es un Array.
     */
    public boolean isArray() {
        return array;
    }

    /**
     * Establece el Estado que indica si el Valor de Retorno es un Array.
     * @param array Estado que indica si el Valor de Retorn es un Array.
     */
    public void setArray(boolean array) {
        this.array = array;
    }

    /**
     * Devuelve los Parametros del Método.
     * @return Parametros del Método.
     */
    public ArrayList<ParametroMetodoBase> getObjParametrosMetodo() {
        return objParametrosMetodo;
    }

    /**
     * Establece los Parametros del Método.
     * @param objParametros Parametros del Método.
     */
    public void setObjParametrosMetodo(ArrayList<ParametroMetodoBase> objParametros) {
        this.objParametrosMetodo = objParametros;
    }

    /**
     * Devuelve el Estado que indica si el Valor de Retorno es un Tipo Primitivo (char,int...)
     * @return Estado que indica si el Valor de Retorno es un Tipo Primitivo (char,int...)
     */
    public boolean isPrimitive() {
        return primitive;
    }

    /**
     * Establece el Estado que indica si el Valor de Retorno es un Tipo Primitivo (char,int...)
     * @param primitive Estado que indica si el Valor de Retorno es un Tipo Primitivo (char,int...)
     */
    public void setPrimitive(boolean primitive) {
        this.primitive = primitive;
    }

    /**
     * Devuelve la Cadena de Definición del Tipo de Dato devuelto.
     * @return Cadena de Definición del Tipo de Dato devuelto.
     */
    public String getStrReturn() {
        return strReturn;
    }

    /**
     * Establece la Cadena de Definición del Tipo de Dato devuelto.
     * @param strReturn Cadena de Definición del Tipo de Dato devuelto.
     */
    public void setStrReturn(String strReturn) {
        this.strReturn = strReturn;
    }

    @Override
    public String toString() {
        try{
            String strParametros = "";
            for(ParametroMetodoBase objParametro : this.objParametrosMetodo){
                strParametros += objParametro.getClasspath() + ",";
            }
            if(!strParametros.isEmpty())
                strParametros = strParametros.substring(0, strParametros.length() - 1);
            return "private " + strReturn + ' '  + this.getStrNombre() + "(" + strParametros + ")";
        } catch(java.lang.NullPointerException ex){}
        return "";
    }
    
    @Override
    public int compareTo(Object o) {
       try{
        MetodoBase obj = (MetodoBase) o;
        if(this.id > obj.id)
            return 1;
        else if(this.id < obj.id)
            return -1;
        else
            return 0;
    }catch(java.lang.NullPointerException ex){}
       return 0;
    }   
}
